{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 决策边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import datasets\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris = datasets.load_iris()\n",
    "X = iris.data\n",
    "y = iris.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((100, 2), (100,))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 我们知道逻辑回归是解决2分类问题的，但鸢尾花数据集有4个分类，所以我们需要只取其中2个分类\n",
    "# 另外为了可视化，我们只取其中2个特征而不是全部特征\n",
    "X = X[y<2,:2]\n",
    "y = y[y<2]\n",
    "X.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10882b4e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 分类0的散点图\n",
    "plt.scatter(X[y==0,0], X[y==0,1], color='red')\n",
    "\n",
    "# 分类1的散点图\n",
    "plt.scatter(X[y==1,0], X[y==1,1], color='blue')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用我们自己编写的逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from playML.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, seed=666)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression()"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from playML.logistic_regression import LogisticRegression\n",
    "\n",
    "log_reg = LogisticRegression()\n",
    "log_reg.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "评分结果不错，不过当然是因为我们的数据很简单"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.92972035,  0.98664939,  0.14852024,  0.17601199,  0.0369836 ,\n        0.0186637 ,  0.04936918,  0.99669244,  0.97993941,  0.74524655,\n        0.04473194,  0.00339285,  0.26131273,  0.0369836 ,  0.84192923,\n        0.79892262,  0.82890209,  0.32358166,  0.06535323,  0.20735334])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg.predict_proba(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 在图中画个决策边界看看样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_x2(x1):\n",
    "    return (-log_reg.coef_[0] * x1 - log_reg.intercept_) / log_reg.coef_[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1088b2fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x1_plot = np.linspace(4,8,1000)\n",
    "x2_plot = get_x2(x1_plot)\n",
    "\n",
    "# 分类0的散点图\n",
    "plt.scatter(X[y==0,0], X[y==0,1], color='red')\n",
    "\n",
    "# 分类1的散点图\n",
    "plt.scatter(X[y==1,0], X[y==1,1], color='blue')\n",
    "\n",
    "# 这条就是决策边界\n",
    "plt.plot(x1_plot, x2_plot)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "唯一分类错误的那个红点应该是训练集，所以评分依然是1.0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练集的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x108ae58d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 分类0的散点图\n",
    "plt.scatter(X_train[y_train==0,0], X_train[y_train==0,1], color='red')\n",
    "\n",
    "# 分类1的散点图\n",
    "plt.scatter(X_train[y_train==1,0], X_train[y_train==1,1], color='blue')\n",
    "\n",
    "# 这条就是决策边界\n",
    "plt.plot(x1_plot, x2_plot)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "测试集的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3Xd8FHX+x/HXN6EmQGihhhB6L0JoFlRsCIgienKHBcthPT393VHEgiDWU88726Geh4p3KgmIqGBDRUU0qKTRAoQSOoEECKn7/f2x4Q5jIAns7sxu3s/HIw92Z4bMh3F9Z/Kd73zGWGsREZHQEuZ0ASIi4nsKdxGREKRwFxEJQQp3EZEQpHAXEQlBCncRkRCkcBcRCUEKdxGREKRwFxEJQTWc2nHTpk1tXFycU7sXEQlKK1eu3Gutja5oO8fCPS4ujqSkJKd2LyISlIwxmyuznYZlRERCkMJdRCQEKdxFREKQwl1EJAQp3EVEQpDCXUQkBCncRURCkMJdRCRAiko8vPBFBqu2HvD7vhy7iUlEpDpJzcphckIyadtzueXsYvq0aejX/SncRUT8KL+ohL9/vp6XvtxIo4havDi+Hxf3aun3/SrcRUT8JCkzm0kJyWzcc5gr+8dw38juREXUDMi+Fe4iIj52qKCYJxev4fXvNtMqqi6v3zCQoZ0r7PXlUwp3EREf+nLdHu5NTGF7zhGuGxLHny/qQmTtwEetwl1ExAcO5BUyc9FqEn7cRofoSN69eQjxcY0dq0fhLiJyij5K2cH976WxP6+QO87tyB3DOlKnZrijNSncRURO0u7cfB54L43FaTvp2boBc24YQI9WUU6XBSjcRUSqzFrLuyu38fCidPKLPUwe3pXfn9WOGuHuuS+00uFujAkHkoAsa+2oMusmAE8CWaWLnrPWvuKrIkVE3GJrdh73zk9h2fq9DIxrzGNje9E+up7TZf1KVc7c7wJWAw2Os/5ta+0dp16SiIj7lHgsry/P5MklazHAzEt7MH5QW8LCjNOllatS4W6MiQFGArOAe/xakYiIy2TsPsjkhBRWbt7P2Z2jeeTyXrRuWNfpsk6osmfufwUmAfVPsM1YY8xQYB1wt7V266kWJyLipKISD//4cgN/+yyDiNrhPHNVHy7r2xpj3Hm2fqwKw90YMwrYba1daYw55zibvQ/821pbYIy5GZgDDCvne00EJgLExsaedNEiIv6Wsi2HSQnJrN6Ry8jeLXlodA+a1qvtdFmVZqy1J97AmEeBa4BioA7eMfdEa+3Vx9k+HMi21p5wPlB8fLxNSko6qaJFRPwlv6iEv366npeXbaRJZC1mXtaTi3q0cLqs/zLGrLTWxle0XYVn7tbaqcDU0m96DvCnssFujGlprd1R+nY03guvIiJBZcXGfUxJTGHT3sNcFd+Ge0d2I6puYBp9+dpJz3M3xswAkqy1C4E7jTGj8Z7dZwMTfFOeiIj/Hcwv4onFa3nju820aVyXuTcN4oyOTZ0u65RUOCzjLxqWERE3WLp2N9MSU9iRm8/1p7fjTxd1JqKWe+/v9NmwjIhIKNp/uJCZi9JJ/CmLTs3qkXDr6fSLbeR0WT6jcBeRasVaywcpO3jwvTRyjhRx53mduP3cDtSu4WyjL19TuItItbErN5/7FqTySfouesdE8eZNg+jW8ng33Qc3hbuIhDxrLe8kbeXhD1ZTWOzh3hFdueEMdzX68jWFu4iEtC378piSmMy3G/YxqF1jHh/bm7imkU6X5XcKdxEJSSUey7++zeQvS9YSHmaYNaYnvx0Q69pGX76mcBeRkLNu10EmzUvm560HGNa1GbPG9KRllLsbffmawl1EQkZhsYcXv9jAc0vXU79OTZ4d15fRfVoFRaMvX1O4i0hIWLX1AJMTklmz8yCj+7TiwUu60ySIGn35msJdRILakcISnvl0Ha8s20iz+nV45dp4zu/e3OmyHKdwF5GgtXzDPqYmJpO5L4/fDoxl6oiuNKgTnI2+fE3hLiJBJze/iMc+WsNbK7bQtkkEb/1+EKd3CO5GX76mcBeRoPLZ6l1Mm5/K7oP5TBzanrvP70zdWqHVOsAXFO4iEhT2HSrgoffTWbhqO12a1+ela/rTt01Dp8tyLYW7iLiatZaFq7bz0PvpHMwv4u7zO3PrOR2oVSN0Wwf4gsJdRFxrR84R7pufymdrdtOnTUOeGNubLi3qO11WUFC4i4jreDyW//ywlUc/XE2Rx8N9I7tx/RntCK8mrQN8QeEuIq6SufcwUxKT+W5jNqd3aMKjl/eibZPQb/Tlawp3EXGF4hIP//xmE099vI5a4WE8dnkvrhrQplq2DvAFhbuIOG7Nzlwmz0tm1bYczu/WnIcv60mLqDpOlxXUFO4i4piC4hKeX7qBF5ZmEFW3Jn//7WmM6t1SZ+s+oHAXEUf8tGU/kxOSWbfrEGNOa839o7rTOLKW02WFDIW7iARUXmExT328jn9+s4kWDerwzwnxDOuqRl++pnAXkYD5NmMvUxJT2JKdx9WDY5k8vCv11ejLLxTuIuJ3OUeKePTD1fznh620axrJ2xMHM6h9E6fLCmm6f1eOb+5ciIuDsDDvn3PnOl2RBKGP03ZywdNf8k7SVm4+uz0f3XWWgj0AdOYu5Zs7FyZOhLw87/vNm73vAcaPd64uCRp7DxUwfWEai5J30LVFfV65Lp7eMWr0FSjGWuvIjuPj421SUpIj+5ZKiIvzBnpZbdtCZmagq5EgYq1lwc9ZPPR+OnkFJfxhWEduOacDNcM1UOALxpiV1tr4irbTmbuUb8uWqi0XAbYfOMK0+SksXbuH02K9jb46NVejLyco3KV8sbHln7nHxga+FnE9j8cy9/stPPbhajwWHrykO9cOiVOjLwcp3KV8s2b9cswdICLCu1zkGBv3HGJKQgrfZ2ZzZsemPHp5L9o0jnC6rGpP4S7lO3rRdNo071BMbKw32HUxVUoVl3h45etNPPPJOmrXCOOJK3pzZf8YtQ5wiUqHuzEmHEgCsqy1o8qsqw28DvQH9gFXWWszfVinOGH8eIW5lCt9ey6TElaRmpXLRT2aM/PSnjRroEZfblKVM/e7gNVAg3LW3Qjst9Z2NMaMAx4HrvJBfSLiIgXFJTz3eQYvfrGBhhE1eWF8Py7u2UJn6y5UqXA3xsQAI4FZwD3lbHIpML309TzgOWOMsU7NsxQRn1u5OZvJCSlk7D7E2H4x3DeyG43U6Mu1Knvm/ldgEnC8OU2tga0A1tpiY0wO0ATYe8oVioijDhcU8+SStcxZnkmrqLrMuWEgZ3eOdrosqUCF4W6MGQXsttauNMaccyo7M8ZMBCYCxGpKnYjrLVu/h6mJKWzbf4TrhrTlz8O7Uq+25mEEg8r8VzoDGG2MGQHUARoYY9601l59zDZZQBtgmzGmBhCF98LqL1hrZwOzwXuH6qkWLyL+kZNXxMMfpPPuym20j47k3VuGMCCusdNlSRVUGO7W2qnAVIDSM/c/lQl2gIXAdcBy4Argc423iwSnxak7uf+9VLIPF3LbOR2487xO1KkZ7nRZUkUn/fuVMWYGkGStXQi8CrxhjMkAsoFxPqpPRAJk98F8pi9M48OUnXRv2YDXJgygZ+sop8uSk1SlcLfWfgF8Ufr6gWOW5wNX+rIwEQkMay0JP2Yxc1E6R4pK+PNFXZg4tL0afQU5XRkRqca27c/j3vmpfLVuD/FtG/HY2N50bFbP6bLEBxTuItWQx2N547vNPL54DQAPje7BNYPbEqZGXyFD4S5SzWzYc4jJ85JJ2ryfoZ2jeWRMT2IaqdFXqFG4i1QTRSUeZn+1kWc/W0/dmuH85co+jO3XWq0DQpTCXaQaSM3KYdK8ZNJ35DKiVwumj+5Bs/pq9BXKFO4iISy/qIRnP1vP7K820jiyFi9d3Y/hPVs6XZYEgMJdJET9kJnN5HnJbNx7mCv7x3DfyO5ERdR0uiwJEIW7SIg5VFDME4vX8PryzcQ0qssbNw7krE5q9FXd6C4FCT5z50JcHISFef+cO9fpilzjy3V7uOiZr3jju81MOD2OJX8cqmCvpnTmLsFl7txfPtt182bve6jWT406kFfIjEXpJP6YRYfoSObdMoT+bdXoqzozTvX3io+Pt0lJSY7sW4JYXJw30Mtq2xYyMwNdjeOstXyUupMH3kvlQF4Rt5zdgTuGdVSjrxBmjFlprY2vaDuduUtw2bKlastD2O7cfO5/L5Ulabvo2boBc24YSI9WavQlXgp3CS6xseWfuVejh79Ya3l35TYeXpROQbGHKRd35aYz21FDjb7kGAp3CS6zZv1yzB0gIsK7vBrYmp3H1MQUvs7Yy8C4xjw2thfto9XoS35N4S7B5ehF02nTvEMxsbHeYA/xi6klHsvryzN5YvFawgzMvKwn4wfGqtGXHJfCXYLP+PEhH+bHWr/rIJMTkvlxywHO6RLNrDG9aN2wrtNlicsp3EVcqqjEw0tfbODvn2cQWTucZ67qw2V91ehLKkdXYMQ/dKPRKUnZlsMlf/+apz5Zx4U9mvPJPWcz5rQYBbtUms7cxfd0o9FJyy8q4ZlP1/HyVxtpWq82s6/pz4U9WjhdlgQh3cQkvqcbjU7Kio37mJKYwqa9hxk3oA1TR3Qjqq4afckv6SYmcY5uNKqSg/lFPL54DW9+t4U2jesy96ZBnNGxqdNlSZBTuIvv6UajSlu6Zjf3zk9hZ24+N57Zjv+7sDMRtfS/pZw6fYrE96r5jUaVkX24kBnvp7Hg5+10alaPhFtPp19sI6fLkhCicBffq6Y3GlWGtZZFyTuYvjCNnCNF3HVeJ247twO1a6jRl/iWwl38o5rdaFQZu3LzmTY/lU9X76J3TBRzfz+Iri0aOF2WhCiFu4ifWWt5+4etzPpwNYXFHqaN6Mb1Z8Sp0Zf4lcJdxI827zvM1MQUvt2wj0HtGvP42N7ENY10uiypBhTuIn5Q4rG89s0m/vLxWmqEhfHImF6MG9BGjb4kYBTuIj62dudBJiUks2rrAc7r2oyHx/SkZZQafUlgKdxFfKSw2MMLX2Tw/NIM6tepybPj+jK6Tyv1gxFHKNxFfGDV1gNMmpfM2l0HubRvKx4Y1Z0m9Wo7XZZUYwp3kVNwpLCEpz9Zy6tfb6JZ/Tq8cm0853dv7nRZIhWHuzGmDvAVULt0+3nW2gfLbDMBeBLIKl30nLX2Fd+WKuIu327Yy9TEFDbvy+N3g2KZcnFXGtRRoy9xh8pMtC0Ahllr+wB9geHGmMHlbPe2tbZv6ZeC3S1uuw1q1ABjvH/edtv/1qnn+knJzS9iamIKv3t5BQBv/X4Qj4zppWAXV6nwzN16ewIfKn1bs/TLmT7BUjW33QYvvvi/9yUl/3t/xhnquX4SPk3fxbQFKew5WMDEoe25+/zO1K2l1gHiPpXq526MCQdWAh2B5621k8usnwA8CuwB1gF3W2u3nuh7qp97ANSo4Q30ssLDISZGPderYN+hAh56P52Fq7bTtUV9Hh/bmz5tGjpdllRDle3nXqWHdRhjGgLzgT9Ya1OPWd4EOGStLTDG3AxcZa0dVs7fnwhMBIiNje2/ubxwEd850RQ8Y6C8//bGgMfjv5qCjLWWhau2M31hGocKirnj3E7cek4HatVQ6wBxRmXDvUqfUGvtAWApMLzM8n3W2oLSt68A/Y/z92dba+OttfHR0dFV2bWcjPDjDBeEhx+/t7p6rv/Xjpwj3DQnibv+8zNtm0TywZ1ncdf5nRTsEhQq/JQaY6JLz9gxxtQFLgDWlNmm5TFvRwOrfVmknKSjY+jlLZ81y9tj/VjquQ6Ax2OZu2IzFzz9Fd9s2Mt9I7uRcOvpdG5e3+nSRCqtMvPcWwJzSsfdw4B3rLWLjDEzgCRr7ULgTmPMaKAYyAYm+KtgqYIXXvD+OXu2d+w9PNwb7EeXg3qul7Fp72GmJCSzYlM2p3dowmOX9ya2SUTFf1HEZfSAbBGguMTDP7/ZxFMfr6NWjTDuG9mN38S3UesAcR2/jLnLSdJ8cldbvSOXy1/8lkc+XMPQztF8es/ZXDUgVsEuQU3tB/xt7lzNJ3epguISnl+6gReWZhBVtybP/e40RvZqqVCXkKBhGX+Li9N8chf6cct+Js9LZv3uQ4w5rTUPjOpOo8haTpclUqHKDsvozN3ftmyp2nLxq7zCYv6yZB2vfbuJFg3q8NqEAZzbtZnTZYn4nMLd32Jjyz9z13zygPsmYy9TEpPZmn2Eawa3ZdLwLtRXPxgJUbqg6m+aT+64nCNFTJ6XzPhXVlAjLIy3Jw5m5mU9FewS0nTm7m9HL5pqPrkjPk7byX0LUtl3uJBbzu7AH8/vRJ2aavQloU/hHgjjxyvMA2zPwQKmv5/GB8k76NayAa9eN4BeMVFOlyUSMAp3CSnWWub/lMWMRenkFZTwpws7c/PZHagZrhFIqV70iZeQkXXgCNf/6wfueWcV7ZtG8uFdZ3LHsE6uCHbdxyaBpjN3CXpHG3099tEaPBYevKQ71w6JIzzMHTcj6T42cYJuYpKgtnHPIaYkpPB9ZjZndWrKI2N60aaxuxp96T428SXdxCQhrbjEw8vLNvHMp+uoUyOMJ6/ozRX9Y1zZOkD3sYkTFO4SdNK25zA5IZnUrFwu6tGcmZf2pFmDOk6XdVy6j02coHCXoJFfVMLfP1/PS19upFFELV4c34+Le7Ws+C86bNasX465g+5jE/9TuEtQWLk5m0nzktmw5zBj+8Vw/6huNIwIjkZfuo9NnKBwF1c7XFDMk0vWMmd5Jq2i6jLnhoGc3Tn4nr+r+9gk0JyfACz+FcQTrL9at4cLn/mKOcszuXZwW5bcPTQog13ECTpzD2VBOsE6J6+ImR+kM2/lNtpHR/LOzUMYENfY6bJEgormuYeyIJxgvTh1B/e/l0b24UJuHtqeO89Toy+RY2meuwTVBOvdB/N58L00PkrdSfeWDXhtwgB6tlajL5GTpXAPZUEwwdpay7yV23j4g9UcKSph0vAu/P6s9q7oByMSzBTuoczlE6y3Zudx7/wUlq3fy4C4Rjw2tjcdous5XZZISFC4hzKXTrD2eCyvL8/kiSVrMcCMS3tw9aC2hLmk0ZdIKFC4hzqXTbDO2H2IKQnJJG3ez9DO0TwypicxjdzV6EskFGhgM9gFyTz2ohIPzy/NYMSzy1i/+xBPXdmHOdcPULAHQJB8RMTHdOYezIJkHntqVg6T5iWTviOXEb1a8NDonkTXr+10WdVCkHxExA80zz2YuXwee35RCc9+tp7ZX22kcWQtZl7ak+E9WzhdVrXi8o+InATNc68OXDyP/YfMbCbPS2bj3sP8Jj6GaSO6ExVR0+myqh0Xf0TEzxTuwcyF89gPFRTzxOI1vL58MzGN6vLmjYM4s1NTx+qp7lz4EZEA0QXVYDZrlnfe+rEcnMe+dO1uLnz6S974bjPXnxHHkj8OVbA7zGUfEQkgnbkHM5fMY99/uJCZi9JJ/CmLjs3qMe+W0+nftlFAa5DyueQjIg7QBVU5adZaPkzZyYMLUzmQV8St53TgjmEdqV1Djb5E/KWyF1QrHJYxxtQxxnxvjFlljEkzxjxUzja1jTFvG2MyjDErjDFxJ1e2/EpFk5RPdf1J2p2bz81vrOT2t36kZVRdFt5xJv93YRefBLtb52W7tS6RcllrT/gFGKBe6euawApgcJltbgNeKn09Dni7ou/bv39/KxV4801rIyKshf99RUR4l/ti/UnweDz27e+32J4PLradp31oX/oiwxYVl/jgH+u3kkO6Lql+gCRbQb5aa6s2LGOMiQC+Bm611q44ZvkSYLq1drkxpgawE4i2J/jmGpaphIomKZ/q+iramp3H1MQUvs7Yy8B2jXns8l6093GjL7fOy3ZrXVL9VHZYplLhbowJB1YCHYHnrbWTy6xPBYZba7eVvt8ADLLW7i2z3URgIkBsbGz/zeX93yL/ExbmPUksyxjweE59fSWVeCxzvs3kySVrCQ8zTLm4K78bGOuXRl8+Ktnn3FqXVD8+G3MHsNaWWGv7AjHAQGNMz5Mpylo721obb62Nj47WszArdLzJyEeXn+r6Sli/6yBXvPQtMxalM6h9Yz6+eyhXD/ZfB0cflOwXbq1L5HiqNM/dWnsAWAoML7MqC2gDUDosEwXs80WB1VpFk5RPdf0JFBZ7+Ntn6xn5t6/J3HuYv17Vl9cmDKBVw7on+Y+pHLfOy3ZrXSLHVdGgPBANNCx9XRdYBowqs83t/PKC6jsVfV9dUK2kN9+0tm1ba43x/ln2Ct6pri/Hqq377UXPfGnbTl5k73jrR7vnYL5P/imVdRIlB4Rb65LqBV9dUDXG9AbmAOF4z/TfsdbOMMbMKN3JQmNMHeAN4DQgGxhnrd14ou+rC6ruk19UwjOfrOPlZRuJrl+bhy/rxQXdmztdlogcw2eNw6y1yXhDu+zyB455nQ9cWdUixT2+27iPKQnJZO7L47cD2zDl4m5E1VWjL5Fgpd4y1dzB/CKmzU9h3Ozv8Fh466ZBPHp5b0eDXTcLiZw69Zapxj5fs4tp81PZlZvPTWe2454LOxNRy9mPhB4uIeIb6i1TDWUfLmTG+2ks+Hk7nZvX4/GxvTkt1h2NvnSzkMiJ6WEd8ivWWt5P3sH0hWkczC/irvM6cfu5HalVwz2jc3q4hIhvKNyriZ05+dy3IJVPV++iT0wUj18xiK4tGjhd1q/o4RIivqFwD3HWWv7zw1Ye+WA1RR4P00Z044Yz2xHupztMT9WsWb8ccwfdLCRyMhTuIWzzvsNMSUhh+cZ9DG7fmMcu701c00inyzohPVxCxDcU7iGoxGN57ZtN/OXjtdQMC+ORMb0YN6CN3/rB+Nr48QpzkVOlcA8xa3ceZFJCMqu2HuC8rs14eExPWkb5tx+MiLiPwj1EFBZ7eOGLDJ5fmkH9OjX5229P45LeLTEmOM7WRcS3FO4h4OetB5g8L5m1uw5yad9WPHhJDxpH1nK6LBFxkMI9iB0pLOGpj9fyz2820ax+HV69Lp7zuqnRl4go3IPWtxv2MiUhhS3ZefxuUCxTLu5Kgzpq9CUiXgr3IJObX8SjH67m399vpW2TCP79+8EM6dDE6bJExGUU7kHk0/RdTFuQwp6DBdw8tD1/PL8zdWuFO12WiLiQwj0I7DtUwPT303l/1Xa6tqjPy9fG0zumodNliYiLuadjlPyKtZYFP2Vx/tNfsjh1B/dc0JmFd5wZsGBXX3WR4KUzd5fafuAI9y1I5fM1u+nbpiFPXNGbzs3rB2z/6qsuEtzUz91lPB7LW99v4bGP1lDisfzpoi5MOD0u4I2+1FddxJ3Uzz0Ibdp7mCkJyazYlM0ZHZvw6JjexDaJcKQW9VUXCW4KdxcoLvHw6tebePqTddSqEcYTY3tzZXyMo60D1FddJLgp3B2Wvj2XyQnJpGTlcEH35jx8WU+aN6jjdFnqqy4S5BTuDikoLuG5zzN48YsNNIyoyfO/68eIXi1c0+hLfdVFgpvC3QErN+9nckIyGbsPcflprbl/VHcaubDRl/qqiwQvhXsA5RUW8+SStfzr20xaNqjDa9cP4NwuzZwuS0RCkMI9QL5ev5cpicls23+Eawa3ZdLwLtRXoy8R8ROFu5/lHCli1gfpvJO0jXZNI3nn5iEMbNfY6bJEJMQp3P1oSdpO7l+Qyr7Dhdx6TgfuOq8TdWqq0ZeI+J/C3Q/2HCxg+sI0PkjZQbeWDXj1ugH0iolyuiwRqUYU7j5krSXxxyxmLErnSGEJf76oCxOHtqdmuPqziUhgKdx9JOvAEe5NTOHLdXvoF+tt9NWxWeAafYmIHEvhfoo8HsubKzbz+EdrsMD0S7pzzZDAN/oSETlWheFujGkDvA40Byww21r7bJltzgHeAzaVLkq01s7wbanus2HPIaYkJPND5n7O6tSUR8b0ok1jZxp9iYgcqzKDwcXA/1lruwODgduNMd3L2W6ZtbZv6VdIB3tRiYcXvsjg4meXsXbnQZ68ojev3zBQwS7HpQefSKBVeOZurd0B7Ch9fdAYsxpoDaT7uTZXSs3KYXJCMmnbcxneowUzLutBs/rON/oS99KDT8QJVZrGYYyJA04DVpSzeogxZpUx5iNjTA8f1OYq+UUlPLlkDZc+/w27cgt4cXw/Xrqmv4JdKjRt2i+7a4L3/bRpztQj1UOlL6gaY+oBCcAfrbW5ZVb/CLS11h4yxowAFgCdyvkeE4GJALFB1Bg8KTObSQnJbNxzmLH9Yrh/VDcaRriv0Ze4kx58Ik6o1Jm7MaYm3mCfa61NLLveWptrrT1U+vpDoKYxpmk528221sZba+Ojo6NPsXT/O1xQzPSFaVz5j+UUFHmYc8NAnvpNHwW7VMnxzmOC6PxGglBlZssY4FVgtbX26eNs0wLYZa21xpiBeH9o7PNppQH25bo93JuYwvacI1w3JI4/X9SFyNqaOSpVpwefiBMqk1ZnANcAKcaYn0uX3QvEAlhrXwKuAG41xhQDR4Bx1qknb5+iA3mFzFy0moQft9E+OpJ3bx5CfJwafcnJ04NPxAnGqQyOj4+3SUlJjuz7eD5K2cH976WxP6+QW85uzx+GqdGXiLiLMWaltTa+ou00zgDszs3ngffSWJy2kx6tGjDnhgH0aKVGXyISvKp1uFtrmbdyGzMXpZNf7GHy8K7cdFY7NfoSkaBXbcN9a3Ye985PYdn6vQyIa8RjY3vTIbqe02WJiPhEtQv3Eo/ljeWZPLFkLQaYeWkPxg9qS5gafYlICKlW4Z6x+yCTE1JYuXk/Z3eOZtaYnsQ0Uj8YEQk91SLci0o8/OPLDfztswwiaofz9G/6MOa01nin8IuIhJ6QD/fUrBz+PC+Z1TtyGdmrJdNH9yC6fm2nyxIR8auQDff8ohL++ul6Xl62kcaRtXjp6v4M79nC6bJERAIiJOf8fb8pmxHPLuOlLzdwRb8YPr37bAW7y6i/uYh/hdSZ+8H8Ip5YvJY3vttMTKO6vHnjIM7s9Kv+ZeIw9TcX8b+QaT+wdO1upiWmsCM3n+tPb8efLupMRK2Q+tkVMuLivIFeVtu2kJkZ6GpEgku1aT+w/3AhMxelk/hTFh2b1WPeLafTv20jp8uSE1B/cxErirehAAAFiElEQVT/C9pwt9byQcoOHnwvjZwjRdw5rCO3D+tI7Rpq9OV2sbHln7mrv7mI7wRluO/Kzef+Bal8nL6LXq2jePOmQXRr2cDpsqSS1N9cxP+CLtyXrtnNnf/5icJiD1Mv7sqNZ7ajhhp9BRX1Nxfxv6AL93ZNI+kX24jpo3vQrmmk0+XISRo/XmEu4k9BF+5xTSOZc8NAp8sQEXE1jWeIiIQghbuISAhSuIuIhCCFu4hICFK4i4iEIIW7iEgIUriLiIQghbuISAhyrOWvMWYPUE77qEppCuz1YTm+4ta6wL21qa6qUV1VE4p1tbXWRle0kWPhfiqMMUmV6WccaG6tC9xbm+qqGtVVNdW5Lg3LiIiEIIW7iEgICtZwn+10Acfh1rrAvbWprqpRXVVTbesKyjF3ERE5sWA9cxcRkRNwfbgbY8KNMT8ZYxaVs662MeZtY0yGMWaFMSbOJXVNMMbsMcb8XPp1U4BqyjTGpJTuM6mc9cYY87fS45VsjOnnkrrOMcbkHHO8HghQXQ2NMfOMMWuMMauNMUPKrHfqeFVUl1PHq8sx+/zZGJNrjPljmW0CfswqWZdTx+xuY0yaMSbVGPNvY0ydMuv9lmHB8LCOu4DVQHkPSb0R2G+t7WiMGQc8DlzlgroA3rbW3hGgWo51rrX2ePNnLwY6lX4NAl4s/dPpugCWWWtHBaiWo54FFltrrzDG1AIiyqx36nhVVBc4cLystWuBvuA9uQGygPllNgv4MatkXRDgY2aMaQ3cCXS31h4xxrwDjAP+dcxmfsswV5+5G2NigJHAK8fZ5FJgTunrecB5xhjjgrrc6lLgdev1HdDQGNPS6aKcYIyJAoYCrwJYawuttQfKbBbw41XJutzgPGCDtbbsjYhOf8aOV5dTagB1jTE18P6Q3l5mvd8yzNXhDvwVmAR4jrO+NbAVwFpbDOQATVxQF8DY0l9L5xlj2gSgJgALfGyMWWmMmVjO+v8er1LbSpc5XRfAEGPMKmPMR8aYHgGoqR2wB3itdHjtFWNM2YfyOnG8KlMXBP54lTUO+Hc5y536jB11vLogwMfMWpsF/AXYAuwAcqy1H5fZzG8Z5tpwN8aMAnZba1c6XcuxKlnX+0CctbY38An/+8nsb2daa/vh/dX4dmPM0ADttyIV1fUj3luq+wB/BxYEoKYaQD/gRWvtacBhYEoA9luRytTlxPH6r9KhotHAu4Hcb0UqqCvgx8wY0wjvmXk7oBUQaYy52t/7Pcq14Q6cAYw2xmQC/wGGGWPeLLNNFtAGoPTXnihgn9N1WWv3WWsLSt++AvT3c01H95tV+uduvGOOZZ8k/t/jVSqmdJmjdVlrc621h0pffwjUNMY09XNZ24Bt1toVpe/n4Q3VYzlxvCqsy6HjdayLgR+ttbvKWefIZ6zUcety6JidD2yy1u6x1hYBicDpZbbxW4a5NtyttVOttTHW2ji8v2p9bq0t+1NvIXBd6esrSrfx68T9ytRVZoxxNN4Lr35ljIk0xtQ/+hq4EEgts9lC4NrSGQ2D8f6auMPpuowxLY6OMxpjBuL9XPr1h7S1diew1RjTpXTReUB6mc0CfrwqU5cTx6uM33L8oY+AH7PK1OXQMdsCDDbGRJTu+zx+nQV+y7BgmC3zC8aYGUCStXYh3otObxhjMoBsvGHrhrruNMaMBopL65oQgBKaA/NLP781gLestYuNMbcAWGtfAj4ERgAZQB5wvUvqugK41RhTDBwBxvn7h3SpPwBzS3+d3whc74LjVZm6nDpeR39AXwDcfMwyx49ZJeoK+DGz1q4wxszDOyRUDPwEzA5UhukOVRGREOTaYRkRETl5CncRkRCkcBcRCUEKdxGREKRwFxEJQQp3EZEQpHAXEQlBCncRkRD0//vlOIYfBqHQAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x108b171d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 分类0的散点图\n",
    "plt.scatter(X_test[y_test==0,0], X_test[y_test==0,1], color='red')\n",
    "\n",
    "# 分类1的散点图\n",
    "plt.scatter(X_test[y_test==1,0], X_test[y_test==1,1], color='blue')\n",
    "\n",
    "# 这条就是决策边界\n",
    "plt.plot(x1_plot, x2_plot)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 不规则的决策边界的绘制方法  \n",
    "每个像素点都判断一下其分类，然后给它标颜色"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_decision_boundary(model, axis):\n",
    "    \"\"\"绘制不规则决策边界\"\"\"\n",
    "    x0, x1 = np.meshgrid(\n",
    "        np.linspace(axis[0], axis[1], int((axis[1] - axis[0])*100)).reshape(1,-1),\n",
    "        np.linspace(axis[2], axis[3], int((axis[3] - axis[2])*100)).reshape(1,-1)\n",
    "    )\n",
    "    X_new= np.c_[x0.ravel(), x1.ravel()]\n",
    "    \n",
    "    y_predict = model.predict(X_new)\n",
    "    zz = y_predict.reshape(x0.shape)\n",
    "    \n",
    "    from matplotlib.colors import ListedColormap\n",
    "    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])\n",
    "    \n",
    "    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/seamonster/MachineLearningClassicAlgorithmEnv/lib/python3.6/site-packages/matplotlib/contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10894c7b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(log_reg, axis=[4,7.5, 1.5, 4.5])\n",
    "# 分类0的散点图\n",
    "plt.scatter(X_train[y_train==0,0], X_train[y_train==0,1])\n",
    "\n",
    "# 分类1的散点图\n",
    "plt.scatter(X_train[y_train==1,0], X_train[y_train==1,1])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### kNN的决策边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n           weights='uniform')"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors.classification import KNeighborsClassifier\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/seamonster/MachineLearningClassicAlgorithmEnv/lib/python3.6/site-packages/matplotlib/contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x108cb73c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(knn_clf, axis=[4,7.5, 1.5, 4.5])\n",
    "# 分类0的散点图\n",
    "plt.scatter(X_train[y_train==0,0], X_train[y_train==0,1])\n",
    "\n",
    "# 分类1的散点图\n",
    "plt.scatter(X_train[y_train==1,0], X_train[y_train==1,1])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/seamonster/MachineLearningClassicAlgorithmEnv/lib/python3.6/site-packages/matplotlib/contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x108ca0d30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "knn_clf_all = KNeighborsClassifier()\n",
    "\n",
    "knn_clf_all.fit(iris.data[:,:2], iris.target)\n",
    "\n",
    "plot_decision_boundary(knn_clf_all, axis=[4,8, 1.5, 4.5])\n",
    "\n",
    "plt.scatter(iris.data[iris.target==0,0], iris.data[iris.target==0,1])\n",
    "plt.scatter(iris.data[iris.target==1,0], iris.data[iris.target==1,1])\n",
    "plt.scatter(iris.data[iris.target==2,0], iris.data[iris.target==2,1])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到曲线过于曲折，（过拟合）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/seamonster/MachineLearningClassicAlgorithmEnv/lib/python3.6/site-packages/matplotlib/contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1094792e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "knn_clf_all = KNeighborsClassifier(n_neighbors=50)\n",
    "\n",
    "knn_clf_all.fit(iris.data[:,:2], iris.target)\n",
    "\n",
    "plot_decision_boundary(knn_clf_all, axis=[4,8, 1.5, 4.5])\n",
    "\n",
    "plt.scatter(iris.data[iris.target==0,0], iris.data[iris.target==0,1])\n",
    "plt.scatter(iris.data[iris.target==1,0], iris.data[iris.target==1,1])\n",
    "plt.scatter(iris.data[iris.target==2,0], iris.data[iris.target==2,1])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
